package org.hang.gift.service.impl;

import org.hang.gift.domain.GoodsSku;
import org.hang.gift.mapper.GoodsSkuMapper;
import org.hang.gift.service.IGoodsSkuService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * sku表 服务实现类
 * </p>
 *
 * @author hang
 * @since 2024-04-05
 */
@Service
public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements IGoodsSkuService {

    @Autowired
    private GoodsSkuMapper goodsSkuMapper;

    /**
     * 下单的时候,锁定库存  一次可以购买多个商品,每个商品的购买的量是不一样的
     * @param skuInfos
     */
    @Override
    @Transactional  //加了事务就相当于在锁定库存时做了幂等性校验
    public void lockStock(Map<Long, Integer> skuInfos) {

        Set<Map.Entry<Long, Integer>> entries = skuInfos.entrySet();
        Iterator<Map.Entry<Long, Integer>> iterator = entries.iterator();

        // 可用库存和锁定库存  页面上展示的可购买量=可用库存-锁定库存
        //下单未支付:可用库存= 可用库存;  锁定库存 =锁定库存+当前购买的商品数量num
        //下单支付成功:可用库存= 可用库存-锁定库存;  锁定库存 =锁定库存-当前购买的商品数量
        //取消订单:可用库存= 可用库存 ,锁定库存 =锁定库存-当前购买的商品数量
        while (iterator.hasNext()) {
            Map.Entry<Long, Integer> entry = iterator.next();
            Long skuId = entry.getKey();
            Integer num = entry.getValue();
            //为了防止出现 多人同时下单一个商品，前者锁定库存的值被后者锁定库存的值 覆盖的情况
            // 自己写一个sql语句，只要有一个人下单，就修改 锁定库存一次
            goodsSkuMapper.lockStock(skuId, num);

        }
    }
}
